--- title: "L2-024 部落" created: 2025-11-28 tags: - 算法 --- # L2-024 部落 ## 题目 [L2-024 部落](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=994805056736444416&page=1) ![[image-bb3508e5.png]] ## 思路分析 ## 代码实现 ```cpp #include using namespace std; #define endl '\n' using ll = long long; using ull = unsigned long long; using PII = pair; using Pll = pair; int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; const int inf= 0x3f3f3f3f; priority_queue pq; multiset s; const int MAXN=1e4+10; struct DSU{ vector parent; DSU(int n){ parent.resize(n+1); for(int i=0;i<=n;i++) parent[i]=i; } int find(int x){ if(parent[x]!=x) parent[x]=find(parent[x]); return parent[x]; } void unite(int x,int y){ int fx=find(x); int fy=find(y); if(fx!=fy){ parent[fx]=fy; } } bool connected(int x,int y){ return find(x)==find(y); } }; int main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); DSU dsu(MAXN); int n;cin>>n; unordered_set exist; while(n--){ int k;cin>>k; vector circle(k); for(int i=0;i>circle[i]; exist.insert(circle[i]); } for(int i=1;i roots; for(auto p:exist){ roots.insert(dsu.find(p)); } countT=roots.size(); cout<>q; while(q--){ int a,b;cin>>a>>b; cout<<(dsu.connected(a,b)?"Y":"N")<